Especificación integral — Evaluación de Postulantes para Charla | Fecha: 30-09-2025

Objetivo

Diseñar e implementar un módulo que, dado el contenido de la charla (campo contenido_charla de subtemas_curso) y considerando los antecedentes académicos personales de los postulantes (tabla profesores y sus profesor_documentos), calcule un porcentaje de cumplimiento y entregue un informe HTML completo con ranking y evidencias, almacenando un histórico de evaluaciones por subtema.

Decisión clave La profesión esperada se fija en subtemas_curso.especialista. No se modifica perfil_especialista_json (solo como antecedente si se consulta).

Alcance

Arquitectura lógica (alto nivel)

  • Módulo Configuración: parámetros ajustables (umbral, pesos de score, catálogo de profesiones/sinónimos).
  • Módulo Clasificación de charla: resume el temario y sugiere profesión esperada; se escribe en subtemas_curso.especialista.
  • Módulo Matching: normaliza profesores.especialidad y cruza con especialista del subtema.
  • Módulo Evidencias: lectura de profesor_documentos, extracción de fragmentos relevantes, armado de citas (archivo + snippet).
  • Módulo Scoring: calcula match% (Cobertura 45, Experiencia 35, Actualidad 10, Comunicación 10 —configurable).
  • Generador de Informe: compone HTML con ranking, evidencias y brechas.
  • Histórico: persiste informe y resultados por subtema.
  • Backend: PHP (controladores + servicios).
  • AI: API Gemini para clasificación, resumen y evaluación dirigida (instrucciones estrictas de citar solo con nombre de archivo).
  • Almacenamiento: BD existente + nueva tabla subtema_evaluacion_hist.
  • Acceso Documentos: rutas locales accesibles (mismo host).
  • Seguridad: acceso autenticado a informes y documentos.

Modelo de datos (existente y nuevo)

Tablas existentes (resumen funcional)

TablaUso en flujoCampos relevantes
subtemas_curso Fuente del temario; escritura de especialista. id, titulo, contenido_charla (temario), especialista (profesión esperada), perfil_especialista_json (solo antecedente).
profesores Catálogo de postulantes y su especialidad declarada. id, rut, nombre, apellidos, correo, telefono, ciudad, region, especialidad, cv_resumen, foto_perfil.
profesor_documentos Fuentes de evidencia para cada postulante. id_documento, profesor_id, nombre_documento, ruta_archivo, tipo, descripcion, fecha_doc, modo.

Nueva tabla: histórico de evaluaciones

Se centraliza en una única tabla para mantener el rastro completo (informe HTML, parámetros, resultados y seleccionados).

CampoTipo sugeridoDescripción
idPK, BIGINTIdentificador único de la evaluación.
subtema_idFK → subtemas_curso.idSubtema evaluado.
fecha_evaluacionDATETIMEFecha/hora de la ejecución.
umbral_utilizadoDECIMAL(5,2)Ej.: 60.00.
profesion_esperadaVARCHAR(160)Copia del valor vigente en subtemas_curso.especialista.
parametros_jsonJSONPeso de dimensiones, catálogo activo, etc.
resumen_scores_jsonJSONLista: [{id_profesor, match, dimensiones:{...}}] (todos los evaluados).
postulantes_seleccionadosJSONIDs de seleccionados (≥ umbral) en orden.
brechas_jsonJSONChecklist de “faltaría saber” por seleccionado.
informe_htmlLONGTEXTInforme completo renderizable.
autorVARCHAR(120)Usuario que ejecutó (opcional).
hash_fuenteVARCHAR(64)Huella de contenido_charla (opcional) para trazabilidad.

Si en el futuro prefieres normalizar seleccionados a tabla hija, se crea subtema_evaluacion_seleccionado (1:N).

Parámetros de Configuración (ajustables)

Flujos funcionales

F1. Preparar profesión esperada del subtema

  1. Seleccionar subtema en la UI.
  2. Leer contenido_charla.
  3. Resumir y clasificar (Gemini) para sugerir profesión/subárea.
  4. Aprobar en UI y escribir en subtemas_curso.especialista.

F2. Filtrar postulantes compatibles

  1. Tomar especialista del subtema.
  2. Normalizar profesores.especialidad contra catálogo (sin tocar BD).
  3. Filtrar candidatos cuyo mapeo sea compatible.
  4. Listar candidatos preseleccionados.

F3. Extraer evidencias por candidato

  1. Obtener documentos desde profesor_documentos por profesor_id.
  2. Leer cada archivo (CV/títulos/certificados/otros).
  3. Buscar señales de: Cobertura temática, Experiencia aplicada, Actualidad, Comunicación.
  4. Guardar evidencias como: {archivo, snippet}.

F4. Calcular Match %

  1. Calcular puntajes por dimensión (0–100).
  2. Aplicar pesos configurados → match_global.
  3. Generar “Faltaría saber” (brechas) para llegar a 100%.

F5. Generar informe HTML y guardar histórico

  1. Ordenar por match_global.
  2. Componer el informe HTML (cabecera de charla, resumen, detalle por candidato ≥ umbral, anexo opcional).
  3. Persistir en subtema_evaluacion_hist con parámetros y resultados.
  4. Exponer enlace/descarga del informe.

Endpoints y responsabilidades (sin código)

EndpointEntradaSalidaResponsabilidad
POST /config JSON: umbral, pesos, catálogo profesiones. 200 OK Guardar parámetros (persistir en tabla propia o archivo seguro).
POST /subtemas/:id/clasificar ID subtema. Profesión esperada (texto) + sugerencias. Clasificar con Gemini y escribir en subtemas_curso.especialista tras confirmación.
POST /evaluar subtema_id Informe HTML + resumen JSON Matching, extracción de evidencias, scoring, generación de HTML y guardado en histórico.
GET /historial/:subtema_id subtema_id Lista de evaluaciones previas Recuperar versiones previas (fecha, umbral, seleccionados, enlace a informe).
GET /informe/:eval_id eval_id HTML Servir el HTML guardado en histórico.

Reglas de evaluación

Privacidad y cumplimiento

Plan de pruebas

Cronograma detallado (hit-list ejecutable)

El cronograma asume 2–3 semanas con un equipo pequeño. Ajustar según tiempos internos.

FaseTareas concretasEntregablesResponsableDuración
0. Arranque
  • Confirmar acceso a BD y rutas de documentos.
  • Definir catálogo de profesiones/sinónimos.
  • Acordar pesos y umbral inicial (60%).
  • Crear parámetros iniciales en Módulo Configuración.
Documento de catálogo; registro de parámetros.PM + Dev1–2 días
1. Clasificación
  • Implementar lectura de contenido_charla.
  • Prompt de clasificación (Gemini) y normalización al catálogo.
  • UI para aprobar y escribir en subtemas_curso.especialista.
Profesión esperada fijada por subtema.Dev2–3 días
2. Matching
  • Normalizador de profesores.especialidad contra catálogo.
  • Filtro de postulantes compatibles.
Listado de preseleccionados.Dev1–2 días
3. Evidencias
  • Recorrer profesor_documentos; lectura de archivos.
  • Extracción de snippets (archivo + fragmento).
  • Ensayos de calidad: longitud/claridad.
Repositorio de evidencias por candidato.Dev2–3 días
4. Scoring
  • Calcular dimensiones y match_global con pesos.
  • Generar “faltaría saber”.
  • Aplicar umbral para seleccionados.
Scores por candidato + brechas.Dev1–2 días
5. Informe & Histórico
  • Componer HTML completo (cabecera, resumen, detalle, anexo).
  • Crear subtema_evaluacion_hist y persistir parámetros/resultados/HTML.
  • Exponer endpoints de consulta.
Informe HTML almacenado y consultable.Dev2 días
6. Pruebas & Cierre
  • Ejecutar plan de pruebas (dorados, umbrales, stress).
  • Ajustes finales de pesos/umbral/catálogo si corresponde.
  • Capacitación de usuarios.
Go-live controlado.PM + Dev2–3 días

Criterios de aceptación

Riesgos y mitigaciones

Especificación + Prompts & Plantilla — Evaluación de Postulantes para Charla
Especificación integral + Prompts & Plantilla | Fecha: 30-09-2025

Contexto

En subtemas_curso.contenido_charla está el contenido a enseñar. Los documentos de los postulantes son sus antecedentes académicos personales. El sistema debe citar únicamente el nombre de archivo como evidencia.

Umbral inicial 60% de cumplimiento; ajustable en Configuración. Pesos iniciales: Cobertura 45, Experiencia 35, Actualidad 10, Comunicación 10 (también ajustables).

Prompts ejemplo (solo texto, sin código)

Estos textos se usan como instrucciones para la IA (Gemini). Pueden ajustarse en el área de Configuración.

P1 — Clasificación de la charla (profesión esperada)

Objetivo: Dado el temario extenso en contenido_charla, proponer 1–3 profesiones (y subáreas) que mejor se ajusten. El resultado final se escribe en subtemas_curso.especialista en formato “Profesión / Subárea”.

Instrucciones a la IA:

  • Eres un analista académico. Lee el temario y sugiere las profesiones/subáreas más pertinentes para impartir la charla.
  • Devuelve entre 1 y 3 opciones, cada una con: nombre (“Profesión / Subárea”), breve justificación y un score de adecuación (0–1).
  • Evita profesiones que no tengan relación directa con el temario.
  • Tu salida debe ser breve y clara.

Entradas: título del subtema + contenido_charla.

Salida deseada (texto natural): “Profesión esperada: Abogado / Laboral (0.84). Alternativas: Abogado / Corporativo (0.58) — Justificación: …”

P2 — Extracción de evidencias por candidato

Objetivo: Leer 1–2 documentos por postulante y extraer fragmentos que demuestren cobertura temática, experiencia aplicada, actualidad y comunicación. Citar solo nombre de archivo.

Instrucciones a la IA:

  • Analiza los documentos adjuntos del postulante. Extrae entre 3 y 8 fragmentos como evidencias.
  • Clasifica cada evidencia en: Cobertura, Experiencia, Actualidad o Comunicación.
  • Para cada evidencia, indica: archivo (nombre) y snippet (140–280 caracteres, sin datos sensibles innecesarios).
  • No inventes información; si no hay evidencia explícita, señala “no encontrado”.

Entradas: nombre del postulante + nombres de archivos + texto extraído.

Salida deseada: lista de evidencias con tipo, archivo y snippet.

P3 — Scoring y “faltaría saber”

Objetivo: Calcular puntajes 0–100 por dimensión y un match_global ponderado. Indicar brechas específicas para llegar a 100%.

Instrucciones a la IA:

  • Asigna puntajes por dimensión con base en las evidencias: Cobertura, Experiencia, Actualidad, Comunicación.
  • Calcula match_global = suma ponderada de las cuatro dimensiones con los pesos configurados.
  • Enumera “faltaría saber”: subtemas del temario sin evidencia, certificados no demostrados, desactualización, etc.
  • No incluyas datos sensibles. Redacción breve y accionable.

Entradas: profesión esperada, lista de subtemas clave, evidencias por candidato, pesos.

Salida deseada: match_global + detalle por dimensión + lista de brechas.

P4 — Generación del informe (composición)

Objetivo: Componer texto ordenado para el informe HTML (cabecera, resumen, detalle por candidato ≥ umbral, anexo opcional).

Instrucciones a la IA:

  • Ordena a los candidatos por match_global.
  • Incluye solo quienes estén por encima del umbral.
  • Para cada uno, produce: identificación, perfil, match global y por dimensión, evidencias (archivo + snippet), “faltaría saber”, lista de documentos analizados.
  • Usa frases claras y concisas.

Entradas: profesión esperada, umbral, lista de candidatos con resultados.

Salida deseada: bloques de texto listos para insertar en HTML.

Anexo — Plantilla del informe para un subtema

Rellena los campos entre llaves { } con datos del sistema.

1) Cabecera

Subtema{ subtema.titulo }
Profesión esperada{ subtema.especialista }
Fecha evaluación{ fecha_evaluacion }
Umbral{ umbral }%

Resumen del contenido: { resumen_contenido_charla }

2) Resumen ejecutivo

3) Ranking de seleccionados

{ filas_ranking }
#PostulanteEspecialidad (texto original)Match %

4) Detalle por postulante (≥ umbral)

4.x { postulante.nombre_completo } — { match_global }%

Identificación: RUT { postulante.rut } · Correo { postulante.correo } · Tel { postulante.telefono } · { postulante.ciudad }/{ postulante.region }

Perfil: Especialidad declarada: “{ postulante.especialidad }”

DimensiónPuntaje
Cobertura temática{ d.cobertura } / 100
Experiencia aplicada{ d.experiencia } / 100
Actualidad{ d.actualidad } / 100
Comunicación{ d.comunicacion } / 100
Evidencias citadas (archivo + snippet)
    { lista_evidencias }
Faltaría saber (brechas)
    { lista_brechas }
Documentos analizados
    { lista_documentos }

5) Anexo (opcional) — Postulantes bajo el umbral

{ filas_bajo_umbral }
PostulanteMatch %Notas

6) Metadatos de la evaluación

Pesos usadosCobertura { pesos.cobertura } · Experiencia { pesos.experiencia } · Actualidad { pesos.actualidad } · Comunicación { pesos.comunicacion }
Autor{ autor }
Hash fuente (opcional){ hash_fuente }

Notas de implementación (recordatorio)